﻿using AIStudio.ConSole.Redis.Core;
using System;
using System.Collections.Generic;
using System.Threading;

namespace AIStudio.ConSole.Redis.Ch03
{
    class Program
    {
        static void Main(string[] args)
        {
            //根据连接信息构造客户端对象
            var conn = new CSRedis.CSRedisClient("127.0.0.1:6379,defaultDatabase=0,poolsize=500,ssl=false,writeBuffer=10240,prefix=test_");//prefix所有的key会加上test_
            bool bool_echo;
            long? long_echo;
            decimal? decimal_echo;
            string string_echo;
            string[] list_echo;
            Dictionary<string, string> dic_echo;
            ValueTuple<string, decimal>[] tuple_echo;

            /********************************************************************************************************
            # <start id="string-calls-1"/>
            >>> conn = redis.Redis()
            >>> conn.get('key')             #A
            >>> conn.incr('key')            #B
            1                               #B
            >>> conn.incr('key', 15)        #B
            16                              #B
            >>> conn.decr('key', 5)         #C
            11                              #C
            >>> conn.get('key')             #D
            '11'                            #D
            >>> conn.set('key', '13')       #E
            True                            #E
            >>> conn.incr('key')            #E
            14                              #E
            # <end id="string-calls-1"/>
            *********************************************************************************************************/
            #region string-calls-1
            conn.Del("key");
            string_echo = conn.Get("key");
            Console.WriteLine($"conn.Get('key'); {string_echo}");
            long_echo = conn.IncrBy("key");
            Console.WriteLine($"conn.IncrBy('key'); {long_echo}");
            long_echo = conn.IncrBy("key", 15);
            Console.WriteLine($"conn.IncrBy('key'); {long_echo}");
            long_echo = conn.IncrBy("key", -5);
            string_echo = conn.Get("key");
            Console.WriteLine($"conn.Get('key'); {string_echo}");
            bool_echo = conn.Set("key", 13);
            Console.WriteLine($"conn.Set('key', 13); {PrintHelper.Bool2String_echo(bool_echo)}");
            long_echo = conn.IncrBy("key");
            Console.WriteLine($"conn.IncrBy('key'); {long_echo}");
            #endregion

            /********************************************************************************************************
            # <start id="string-calls-2"/>
            >>> conn.append('new-string-key', 'hello ')     #A
            6L                                              #B
            >>> conn.append('new-string-key', 'world!')
            12L                                             #B
            >>> conn.substr('new-string-key', 3, 7)         #C
            'lo wo'                                         #D
            >>> conn.setrange('new-string-key', 0, 'H')     #E
            12                                              #F
            >>> conn.setrange('new-string-key', 6, 'W')
            12
            >>> conn.get('new-string-key')                  #G
            'Hello World!'                                  #H
            >>> conn.setrange('new-string-key', 11, ', how are you?')   #I
            25
            >>> conn.get('new-string-key')
            'Hello World, how are you?'                     #J
            >>> conn.setbit('another-key', 2, 1)            #K
            0                                               #L
            >>> conn.setbit('another-key', 7, 1)            #M
            0                                               #M
            >>> conn.get('another-key')                     #M
            '!'                                             #N
            # <end id="string-calls-2"/>
            *********************************************************************************************************/
            #region string-calls-2
            conn.Del("new-string-key");
            long_echo = conn.Append("new-string-key", "hello ");
            Console.WriteLine($"conn.Append('new-string-key', 'hello '); {long_echo}");
            long_echo = conn.Append("new-string-key", "world!");
            Console.WriteLine($"conn.Append('new-string-key', 'world!'); {long_echo}");
            string_echo = conn.GetRange("new-string-key", 3, 7);
            Console.WriteLine($"conn.GetRange('new-string-key', 3, 7); {string_echo}");
            long_echo = conn.SetRange("new-string-key", 0, "H");
            Console.WriteLine($"conn.SetRange('new-string-key', 0, 'H'); {long_echo}");
            long_echo = conn.SetRange("new-string-key", 6, "W");
            Console.WriteLine($"conn.SetRange('new-string-key', 6, 'W'); {long_echo}");
            string_echo = conn.Get("new-string-key");
            Console.WriteLine($"conn.Get('new-string-key'); {string_echo}");
            bool_echo = conn.SetBit("another-key", 2, true);
            Console.WriteLine($"conn.SetBit('another-key', 2, true); {PrintHelper.Bool2String_echo(bool_echo)}");
            bool_echo = conn.SetBit("another-key", 7, true);
            Console.WriteLine($"conn.SetBit('another-key', 7, true); {PrintHelper.Bool2String_echo(bool_echo)}");
            string_echo = conn.Get("another-key");
            Console.WriteLine($"conn.Get('another-key'); {string_echo}");
            #endregion

            /********************************************************************************************************
            # <start id="list-calls-1"/>
            >>> conn.rpush('list-key', 'last')          #A
            1L                                          #A
            >>> conn.lpush('list-key', 'first')         #B
            2L
            >>> conn.rpush('list-key', 'new last')
            3L
            >>> conn.lrange('list-key', 0, -1)          #C
            ['first', 'last', 'new last']               #C
            >>> conn.lpop('list-key')                   #D
            'first'                                     #D
            >>> conn.lpop('list-key')                   #D
            'last'                                      #D
            >>> conn.lrange('list-key', 0, -1)
            ['new last']
            >>> conn.rpush('list-key', 'a', 'b', 'c')   #E
            4L
            >>> conn.lrange('list-key', 0, -1)
            ['new last', 'a', 'b', 'c']
            >>> conn.ltrim('list-key', 2, -1)           #F
            True                                        #F
            >>> conn.lrange('list-key', 0, -1)          #F
            ['b', 'c']                                  #F
            # <end id="list-calls-1"/>
            *********************************************************************************************************/
            #region list-calls-1
            conn.Del("list-key");
            long_echo = conn.RPush("list-key", "last");
            Console.WriteLine($"conn.RPush('list-key', 'last'); {long_echo}");
            long_echo = conn.LPush("list-key", "first");
            Console.WriteLine($"conn.LPush('list-key', 'first'); {long_echo}");
            long_echo = conn.RPush("list-key", "new last");
            Console.WriteLine($"conn.RPush('list-key', 'new last'); {long_echo}");
            list_echo = conn.LRange("list-key", 0, -1);
            Console.WriteLine($"conn.LRange('list-key', 0, -1); {PrintHelper.StringArray2String(list_echo)}");
            string_echo = conn.LPop("list-key");
            Console.WriteLine($"conn.LPop('list-key'); {string_echo}");
            string_echo = conn.LPop("list-key");
            Console.WriteLine($"conn.LPop('list-key'); {string_echo}");
            list_echo = conn.LRange("list-key", 0, -1);
            Console.WriteLine($"conn.LRange('list-key', 0, -1); {PrintHelper.StringArray2String(list_echo)}");
            long_echo = conn.RPush("list-key", "a", "b", "c");
            Console.WriteLine($"conn.RPush('list-key', 'a', 'b', 'c'); {long_echo}");
            list_echo = conn.LRange("list-key", 0, -1);
            Console.WriteLine($"conn.LRange('list-key', 0, -1); {PrintHelper.StringArray2String(list_echo)}");
            bool_echo = conn.LTrim("list-key", 2, -1);
            Console.WriteLine($"conn.LTrim('list-key', 2, -1); {PrintHelper.Bool2String_echo(bool_echo)}");
            list_echo = conn.LRange("list-key", 0, -1);
            Console.WriteLine($"conn.LRange('list-key', 0, -1); {PrintHelper.StringArray2String(list_echo)}");
            #endregion

            /********************************************************************************************************
            # <start id="list-calls-2"/>
            >>> conn.rpush('list', 'item1')             #A
            1                                           #A
            >>> conn.rpush('list', 'item2')             #A
            2                                           #A
            >>> conn.rpush('list2', 'item3')            #A
            1                                           #A
            >>> conn.brpoplpush('list2', 'list', 1)     #B
            'item3'                                     #B
            >>> conn.brpoplpush('list2', 'list', 1)     #C
            >>> conn.lrange('list', 0, -1)              #D
            ['item3', 'item1', 'item2']                 #D
            >>> conn.brpoplpush('list', 'list2', 1)
            'item2'
            >>> conn.blpop(['list', 'list2'], 1)        #E
            ('list', 'item3')                           #E
            >>> conn.blpop(['list', 'list2'], 1)        #E
            ('list', 'item1')                           #E
            >>> conn.blpop(['list', 'list2'], 1)        #E
            ('list2', 'item2')                          #E
            >>> conn.blpop(['list', 'list2'], 1)        #E
            >>>
            # <end id="list-calls-2"/>
            *********************************************************************************************************/

            #region list-calls-2
            conn.Del("list");
            conn.Del("list2");
            long_echo = conn.RPush("list", "item1");
            Console.WriteLine($"conn.RPush('list', 'item1'); {long_echo}");
            long_echo = conn.RPush("list", "item2");
            Console.WriteLine($"conn.RPush('list', 'item2'); {long_echo}");
            long_echo = conn.RPush("list2", "item3");
            Console.WriteLine($"conn.RPush('list2', 'item3'); {long_echo}");
            string_echo = conn.BRPopLPush("list2", "list", 1);
            Console.WriteLine($"conn.BRPopLPush('list2', 'list', 1); {long_echo}");
            string_echo = conn.BRPopLPush("list2", "list", 1);
            Console.WriteLine($"conn.BRPopLPush('list2', 'list', 1); {long_echo}");
            list_echo = conn.LRange("list", 0, -1);
            Console.WriteLine($"conn.LRange('list', 0, -1); {PrintHelper.StringArray2String(list_echo)}");
            string_echo = conn.BRPopLPush("list2", "list", 1);
            Console.WriteLine($"conn.BRPopLPush('list2', 'list', 1); {long_echo}");
            string_echo = conn.BLPop(1, "list", "list2");
            Console.WriteLine($"conn.BLPop(1, 'list', 'list2'); {string_echo}");
            string_echo = conn.BLPop(1, "list", "list2");
            Console.WriteLine($"conn.BLPop(1, 'list', 'list2'); {string_echo}");
            string_echo = conn.BLPop(1, "list", "list2");
            Console.WriteLine($"conn.BLPop(1, 'list', 'list2'); {string_echo}");
            #endregion

            /********************************************************************************************************
            # <start id="set-calls-1"/>
            >>> conn.sadd('set-key', 'a', 'b', 'c')         #A
            3                                               #A
            >>> conn.srem('set-key', 'c', 'd')              #B
            True                                            #B
            >>> conn.srem('set-key', 'c', 'd')              #B
            False                                           #B
            >>> conn.scard('set-key')                       #C
            2                                               #C
            >>> conn.smembers('set-key')                    #D
            set(['a', 'b'])                                 #D
            >>> conn.smove('set-key', 'set-key2', 'a')      #E
            True                                            #E
            >>> conn.smove('set-key', 'set-key2', 'c')      #F
            False                                           #F
            >>> conn.smembers('set-key2')                   #F
            set(['a'])                                      #F
            # <end id="set-calls-1"/>
            *********************************************************************************************************/

            #region set-calls-1
            conn.Del("set-key");
            conn.Del("set-key2");
            long_echo = conn.SAdd("set-key", "a", "b", "c");
            Console.WriteLine($"conn.SAdd('set-key', 'a', 'b', 'c'); {long_echo}");
            long_echo = conn.SRem("set-key", "c", "d");
            Console.WriteLine($"conn.SRem('set-key', 'c', 'd'); {long_echo}");
            long_echo = conn.SRem("set-key", "c", "d");
            Console.WriteLine($"conn.SRem('set-key', 'c', 'd'); {long_echo}");
            long_echo = conn.SCard("set-key");
            Console.WriteLine($"conn.SCard('set-key'); {long_echo}");
            list_echo = conn.SMembers("set-key");
            Console.WriteLine($"conn.SMembers('set-key'); {PrintHelper.StringArray2String(list_echo)}");
            bool_echo = conn.SMove("set-key", "set-key2", "a");
            Console.WriteLine($"conn.SMove('set-key', 'set-key2', 'a'); {PrintHelper.Bool2String_echo(bool_echo)}");
            bool_echo = conn.SMove("set-key", "set-key2", "c");
            Console.WriteLine($"conn.SMove('set-key', 'set-key2', 'a'); {PrintHelper.Bool2String_echo(bool_echo)}");
            list_echo = conn.SMembers("set-key2");
            Console.WriteLine($"conn.SMembers('set-key2'); {PrintHelper.StringArray2String(list_echo)}");
            #endregion

            /********************************************************************************************************
            # <start id="set-calls-2"/>
            >>> conn.sadd('skey1', 'a', 'b', 'c', 'd')  #A
            4                                           #A
            >>> conn.sadd('skey2', 'c', 'd', 'e', 'f')  #A
            4                                           #A
            >>> conn.sdiff('skey1', 'skey2')            #B
            set(['a', 'b'])                             #B
            >>> conn.sinter('skey1', 'skey2')           #C
            set(['c', 'd'])                             #C
            >>> conn.sunion('skey1', 'skey2')           #D
            set(['a', 'c', 'b', 'e', 'd', 'f'])         #D
            # <end id="set-calls-2"/>
            *********************************************************************************************************/

            #region set-calls-2
            conn.Del("skey1");
            conn.Del("skey2");
            long_echo = conn.SAdd("skey1", "a", "b", "c", "d");
            Console.WriteLine($"conn.SAdd('skey1', 'a', 'b', 'c', 'd'); {long_echo}");
            long_echo = conn.SAdd("skey2", "c", "d", "e", "f");
            Console.WriteLine($"conn.SAdd('skey2', 'c', 'd', 'e', 'f'); {long_echo}");
            list_echo = conn.SDiff("skey1", "skey2");
            Console.WriteLine($"conn.SDiff('skey1', 'skey2'); {PrintHelper.StringArray2String(list_echo)}");
            list_echo = conn.SInter("skey1", "skey2");
            Console.WriteLine($"conn.SInter('skey1', 'skey2'); {PrintHelper.StringArray2String(list_echo)}");
            list_echo = conn.SUnion("skey1", "skey2");
            Console.WriteLine($"conn.SUnion('skey1', 'skey2'); {PrintHelper.StringArray2String(list_echo)}");
            #endregion

            /********************************************************************************************************
            # <start id="hash-calls-1"/>
            >>> conn.hmset('hash-key', { 'k1':'v1', 'k2':'v2', 'k3':'v3'})   #A
            True                                                            #A
            >>> conn.hmget('hash-key', ['k2', 'k3'])                        #B
            ['v2', 'v3']                                                    #B
            >>> conn.hlen('hash-key')                                       #C
            3                                                               #C
            >>> conn.hdel('hash-key', 'k1', 'k3')                           #D
            True                                                            #D
            # <end id="hash-calls-1"/>
            *********************************************************************************************************/

            #region hash-calls-1
            conn.Del("hash-key");
            bool_echo = conn.HMSet("hash-key", new object[] { "k1", "v1", "k2", "v2", "k3", "v3" });
            Console.WriteLine($"conn.HMSet('hash-key',new string[] {{ 'k1','v1', 'k2', 'v2', 'k3', 'v3' }}); {PrintHelper.Bool2String_echo(bool_echo)}");
            list_echo = conn.HMGet("hash-key", new string[] { "k2", "k3" });
            Console.WriteLine($"conn.HMGet('hash-key', new string[] {{ 'k2','k3' }}); {PrintHelper.StringArray2String(list_echo)}");
            long_echo = conn.HLen("hash-key");
            Console.WriteLine($"conn.HLen('hash-key'); {long_echo}");
            long_echo = conn.HDel("hash-key", new string[] { "k1", "k3" });
            Console.WriteLine($"conn.HDel('hash-key',new string[] {{ 'k1','k3' }}); {long_echo}");
            #endregion

            /********************************************************************************************************
            # <start id="hash-calls-2"/>
            >>> conn.hmset('hash-key2', { 'short':'hello', 'long':1000 * '1'}) #A
            True                                                            #A
            >>> conn.hkeys('hash-key2')                                     #A
            ['long', 'short']                                               #A
            >>> conn.hexists('hash-key2', 'num')                            #B
            False                                                           #B
            >>> conn.hincrby('hash-key2', 'num')                            #C
            1L                                                              #C
            >>> conn.hexists('hash-key2', 'num')                            #C
            True                                                            #C
            # <end id="hash-calls-2"/>
            *********************************************************************************************************/

            #region
            conn.Del("hash-key2");
            bool_echo = conn.HMSet("hash-key2", new object[] { "short", "hello", "long", 1000 * '1' });
            Console.WriteLine($"conn.HMSet('hash-key2',new string[] {{ 'short','hello', 'long', 1000 * '1'}}); {PrintHelper.Bool2String_echo(bool_echo)}");
            list_echo = conn.HKeys("hash-key2");
            Console.WriteLine($"conn.HKeys('hash-key2'); {PrintHelper.StringArray2String(list_echo)}");
            bool_echo = conn.HExists("hash-key2", "num");
            Console.WriteLine($"conn.HExists('hash-key2', 'num'); {PrintHelper.Bool2String_echo(bool_echo)}");
            long_echo = conn.HIncrBy("hash-key2", "num");
            Console.WriteLine($"conn.HIncrBy('hash-key2', 'num'); {long_echo}");
            bool_echo = conn.HExists("hash-key2", "num");
            Console.WriteLine($"conn.HExists('hash-key2', 'num'); {PrintHelper.Bool2String_echo(bool_echo)}");
            #endregion

            /********************************************************************************************************
            # <start id="zset-calls-1"/>
            >>> conn.zadd('zset-key', 'a', 3, 'b', 2, 'c', 1)   #A
            3                                                   #A
            >>> conn.zcard('zset-key')                          #B
            3                                                   #B
            >>> conn.zincrby('zset-key', 'c', 3)                #C
            4.0                                                 #C
            >>> conn.zscore('zset-key', 'b')                    #D
            2.0                                                 #D
            >>> conn.zrank('zset-key', 'c')                     #E
            2                                                   #E
            >>> conn.zcount('zset-key', 0, 3)                   #F
            2L                                                  #F
            >>> conn.zrem('zset-key', 'b')                      #G
            True                                                #G
            >>> conn.zrange('zset-key', 0, -1, withscores = True) #H
            [('a', 3.0), ('c', 4.0)]                            #H
            # <end id="zset-calls-1"/>
            *********************************************************************************************************/

            #region zset-calls-1
            conn.Del("zset-key");
            long_echo = conn.ZAdd("zset-key", new (decimal, object)[] { (3, 'a'), (2, 'b'), (1, 'c') });
            Console.WriteLine($"conn.ZAdd('zset-key', new (decimal, object)[] {{ (3, 'a'),(2, 'b'), (1, 'c') }}); {long_echo}");
            long_echo = conn.ZCard("zset-key");
            Console.WriteLine($"conn.ZCard('zset-key'); {long_echo}");
            decimal_echo = conn.ZIncrBy("zset-key", 'c', (decimal)3);
            Console.WriteLine($"conn.ZIncrBy('zset-key', 'c', (decimal)3); {decimal_echo}");
            decimal_echo = conn.ZScore("zset-key", 'b');
            Console.WriteLine($"conn.ZScore('zset-key', 'b'); {decimal_echo}");
            long_echo = conn.ZRank("zset-key", 'c');
            Console.WriteLine($"conn.ZRank('zset-key', 'c'); {long_echo}");
            long_echo = conn.ZCount("zset-key", 0, 3);
            Console.WriteLine($"conn.ZCount('zset-key', 0, 3); {long_echo}");
            long_echo = conn.ZRem("zset-key", 'b');
            Console.WriteLine($"conn.ZRem('zset-key', 'b'); {long_echo}");
            tuple_echo = conn.ZRangeWithScores("zset-key", 0, 1);
            Console.WriteLine($"conn.ZRangeWithScores('zset-key', 0, 1); {PrintHelper.ValueTuple2String(tuple_echo)}");
            #endregion

            /********************************************************************************************************
            # <start id="zset-calls-2"/>
            >>> conn.zadd('zset-1', 'a', 1, 'b', 2, 'c', 3)                         #A
            3                                                                       #A
            >>> conn.zadd('zset-2', 'b', 4, 'c', 1, 'd', 0)                         #A
            3                                                                       #A
            >>> conn.zinterstore('zset-i', ['zset-1', 'zset-2'])                    #B
            2L                                                                      #B
            >>> conn.zrange('zset-i', 0, -1, withscores = True)                       #B
            [('c', 4.0), ('b', 6.0)]                                                #B
            >>> conn.zunionstore('zset-u', ['zset-1', 'zset-2'], aggregate = 'min')   #C
            4L                                                                      #C
            >>> conn.zrange('zset-u', 0, -1, withscores = True)                       #C
            [('d', 0.0), ('a', 1.0), ('c', 1.0), ('b', 2.0)]                        #C
            >>> conn.sadd('set-1', 'a', 'd')                                        #D
            2                                                                       #D
            >>> conn.zunionstore('zset-u2', ['zset-1', 'zset-2', 'set-1'])          #D
            4L                                                                      #D
            >>> conn.zrange('zset-u2', 0, -1, withscores = True)                      #D
            [('d', 1.0), ('a', 2.0), ('c', 4.0), ('b', 6.0)]                        #D
            # <end id="zset-calls-2"/>
            *********************************************************************************************************/

            #region zset-calls-2
            conn.Del("zset-1");
            conn.Del("zset-2");
            conn.Del("set-1");
            long_echo = conn.ZAdd("zset-1", new (decimal, object)[] { (1, 'a'), (2, 'b'), (3, 'c') });
            Console.WriteLine($"conn.ZAdd('zset-key', new (decimal, object)[] {{ (1, 'a'),(2, 'b'), (3, 'c') }}); {long_echo}");
            long_echo = conn.ZAdd("zset-2", new (decimal, object)[] { (4, 'b'), (1, 'c'), (0, 'd') });
            Console.WriteLine($"conn.ZAdd('zset-key', new (decimal, object)[] {{ (4, 'b'),(1, 'c'), (0, 'd') }}); {long_echo}");
            long_echo = conn.ZInterStore("zset-i", null, CSRedis.RedisAggregate.Sum, "zset-1", "zset-2");
            Console.WriteLine($"conn.ZInterStore('zset-i', null, CSRedis.RedisAggregate.Sum, 'zset-1', 'zset-2'); {long_echo}");
            tuple_echo = conn.ZRangeWithScores("zset-i", 0, -1);
            Console.WriteLine($"conn.ZRangeWithScores('zset-i', 0, -1); {PrintHelper.ValueTuple2String(tuple_echo)}");
            long_echo = conn.ZUnionStore("zset-u", null, CSRedis.RedisAggregate.Min, "zset-1", "zset-2");
            Console.WriteLine($"conn.ZInterStore('zset-u', null, CSRedis.RedisAggregate.Min, 'zset-1', 'zset-2'); {long_echo}");
            tuple_echo = conn.ZRangeWithScores("zset-u", 0, -1);
            Console.WriteLine($"conn.ZRangeWithScores('zset-u', 0, -1); {PrintHelper.ValueTuple2String(tuple_echo)}");
            long_echo = conn.SAdd("set-1", 'a', 'd');
            Console.WriteLine($"conn.SAdd('set-1', 'a', 'd'); {long_echo}");
            long_echo = conn.ZUnionStore("zset-u2", null, CSRedis.RedisAggregate.Sum, "zset-1", "zset-2", "set-1");
            Console.WriteLine($"conn.ZInterStore('zset-u2', null, CSRedis.RedisAggregate.Sum, 'zset-1', 'zset-2', 'set-1'); {long_echo}");
            tuple_echo = conn.ZRangeWithScores("zset-u2", 0, -1);
            Console.WriteLine($"conn.ZRangeWithScores('zset-u2', 0, -1); {PrintHelper.ValueTuple2String(tuple_echo)}");
            #endregion

            //new TestPublisher().Run_Pubsub();

            /********************************************************************************************************
            # <start id="sort-calls"/>
            >>> conn.rpush('sort-input', 23, 15, 110, 7)                    #A
            4                                                               #A
            >>> conn.sort('sort-input')                                     #B
            ['7', '15', '23', '110']                                        #B
            >>> conn.sort('sort-input', alpha = True)                         #C
            ['110', '15', '23', '7']                                        #C
            >>> conn.hset('d-7', 'field', 5)                                #D
            1L                                                              #D
            >>> conn.hset('d-15', 'field', 1)                               #D
            1L                                                              #D
            >>> conn.hset('d-23', 'field', 9)                               #D
            1L                                                              #D
            >>> conn.hset('d-110', 'field', 3)                              #D
            1L                                                              #D
            >>> conn.sort('sort-input', by = 'd-*->field')                    #E
            ['15', '110', '7', '23']                                        #E
            >>> conn.sort('sort-input', by = 'd-*->field', get = 'd-*->field')  #F
            ['1', '3', '5', '9']                                            #F
            # <end id="sort-calls"/>
            *********************************************************************************************************/

            #region sort-calls
            conn.Del("sort-input");
            conn.Del("d-7");
            conn.Del("d-15");
            conn.Del("d-23");
            conn.Del("d-110");
            long_echo = conn.RPush("sort-input", 23, 15, 110, 7);
            Console.WriteLine($"conn.RPush('sort-input',  23, 15, 110, 7); {long_echo}");
            list_echo = conn.Sort("sort-input");
            Console.WriteLine($"conn.Sort('sort-input'); {PrintHelper.StringArray2String(list_echo)}");
            list_echo = conn.Sort("sort-input", isAlpha: true); ;
            Console.WriteLine($"conn.Sort('sort-input'); {PrintHelper.StringArray2String(list_echo)}");
            bool_echo = conn.HSet("d-7", "field", 5);
            Console.WriteLine($"conn.HSet('d-7', 'field', 5); {PrintHelper.Bool2String_echo(bool_echo)}");
            bool_echo = conn.HSet("d-15", "field", 1);
            Console.WriteLine($"conn.HSet('d-15', 'field', 1); {PrintHelper.Bool2String_echo(bool_echo)}");
            bool_echo = conn.HSet("d-23", "field", 9);
            Console.WriteLine($"conn.HSet('d-23', 'field', 9); {PrintHelper.Bool2String_echo(bool_echo)}");
            bool_echo = conn.HSet("d-110", "field", 3);
            Console.WriteLine($"conn.HSet('d-110', 'field', 3); {PrintHelper.Bool2String_echo(bool_echo)}");
            list_echo = conn.Sort("sort-input", by: "d-*->field");
            Console.WriteLine($"conn.Sort('sort-input', by: 'd-*->field'); {PrintHelper.StringArray2String(list_echo)}");
            list_echo = conn.Sort("sort-input", by: "d-*->field", get: "d-*->field");
            Console.WriteLine($"conn.Sort('sort-input', by: 'd-*->field', get: 'd-*->field'); {PrintHelper.StringArray2String(list_echo)}");
            #endregion

            new TestNotrans().Test();

            new TestTrans().Test();

            /********************************************************************************************************
            # <start id="other-calls-1"/>
            >>> conn.set('key', 'value')                    #A
            True                                            #A
            >>> conn.get('key')                             #A
            'value'                                         #A
            >>> conn.expire('key', 2)                       #B
            True                                            #B
            >>> time.sleep(2)                               #B
            >>> conn.get('key')                             #B
            >>> conn.set('key', 'value2')
            True
            >>> conn.expire('key', 100); conn.ttl('key')    #C
            True                                            #C
            100                                             #C
            # <end id="other-calls-1"/>
            *********************************************************************************************************/
            #region other-calls-1
            conn.Del("key");
            bool_echo = conn.Set("key", "value");
            Console.WriteLine($"conn.Set('key', 'value'); {PrintHelper.Bool2String_echo(bool_echo)}");
            string_echo = conn.Get("key");
            Console.WriteLine($"conn.Get('key'); {string_echo}");
            bool_echo= conn.Expire("key", 2);
            Console.WriteLine($"conn.Expire('key', 2); {PrintHelper.Bool2String_echo(bool_echo)}");
            Thread.Sleep(2000);
            string_echo = conn.Get("key");
            Console.WriteLine($"conn.Get('key'); {string_echo}");
            bool_echo = conn.Set("key", "value2");
            Console.WriteLine($"conn.Set('key', 'value2'); {PrintHelper.Bool2String_echo(bool_echo)}");
            bool_echo = conn.Expire("key", 100);
            Console.WriteLine($"conn.Expire('key', 100); {PrintHelper.Bool2String_echo(bool_echo)}");
            long_echo= conn.Ttl("key");
            Console.WriteLine($"conn.Ttl('key'); {long_echo}");
            #endregion


        }
    }
}
